package me.ydq.core.table;

import me.ydq.mapper.Mapping;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;

import java.util.List;
import java.util.Map;

public interface TableManual<T> extends TableBase<T> {

    NamedParameterJdbcTemplate jdbcTemplate();

    String select();

    String columns();

    Map<String, Object> params();

    String where();

    String having();

    String orderBy();

    String groupBy();

    default TableManual<T> addParam(String key, Object value) {
        params().put(key, value);
        return this;
    }

    default List<T> queryList(String sql) {
        return jdbcTemplate().query(sql, params(), rowMapper());
    }

    default <R> List<R> queryList(String sql, RowMapper<R> mapper) {
        return jdbcTemplate().query(sql, params(), mapper);
    }

    default <R> List<R> queryList(String sql, Mapping<R> mapping) {
        return jdbcTemplate().query(sql, params(), (rs, i) -> mapping.map(rs));
    }

    default <R> List<R> queryList(String sql, Class<R> cls) {
        return jdbcTemplate().queryForList(sql, params(), cls);
    }

    default T query(String sql) {
        return jdbcTemplate().queryForObject(sql, params(), rowMapper());
    }

    default <R> R query(String sql, RowMapper<R> mapper) {
        return jdbcTemplate().queryForObject(sql, params(), mapper);
    }

    default <R> R query(String sql, Mapping<R> mapping) {
        return jdbcTemplate().queryForObject(sql, params(), (rs, i) -> mapping.map(rs));
    }

    default <R> R query(String sql, Class<R> cls) {
        return jdbcTemplate().queryForObject(sql, params(), cls);
    }
}
